/*
-----------------------------------------------------------------------------
This source file is part of DIVA
The project of Engineering Lab, dept. of CSIE, NTNU.

Copyright (c) 2000-2006 The Engineering Lab, dept. of CSIE, NTNU.
-----------------------------------------------------------------------------
Filename:    xNodeType_Math.h
Description: 處理任意數學函事式的xNodeType。
History: hyt - 09/09/28 因應WOP_Int_Proxy而修改
-----------------------------------------------------------------------------
*/
#ifndef _xNodeType_Arithmetic_H_
#define	_xNodeType_Arithmetic_H_

#include "xNodeType.h"
#include "WOP_Entry.h"
#include "MyWord.h"


class xNodeType_Math : public xNodeType {

public:
	xNodeType_Math();
	~xNodeType_Math();

	/** formula=mathDialog輸入的字串
	size=總共有幾個wop，如果是false表示是從mds直接處理，理論上從mds
	得到的fromula是符合格式的
	輸出=經過scanner parser之後的訊息，mathdialog會處理這些訊息
	例如不是"TRUE"則彈出警告視窗
	*/
	virtual string isFormulaValidate(string formula,bool flag);
	virtual void setupPorts() ;
	virtual string getType() { return "math" ; }
	virtual void createMappedObject() ;
	virtual xParameter toXParameter(string toType, xOutMappingPort* linked_op); 
	virtual string toMDString(MDSType) ;
	virtual int parseMDString(vector<string>& tokens, int start_index);
	virtual bool update();
	inline  WOP_Entry * getWOP() { return _wop ; }
	/** 是否已經有formula */
	virtual bool haveFormula();
	virtual void removeFormula();
	virtual string getFormula();	// added by howway

	virtual bool verify_rhs_link(xOutMappingPort *left, xInMappingPort *right, xNodeType* rightnode);
	virtual bool verify_lhs_link(xOutMappingPort *left, xNodeType* leftnode, xInMappingPort *right);


protected:
	/** 切string用的 */
	vector<string> stringSplit(string str, string delim);
	/** 第一次計算formula的結果 */
	WOP_Entry *eval(); 
	/** 更新formula的結果 */
	bool updateEntry();
	/** 處理formula的結果的部分 */
	MyWord* computeValue(MyWord* current);
	/** 遞回呼叫清理整個tree */
	void clearTree(MyWord* current);

	xParameterPack _xpp ;
	WOP_Entry * _wop ;
	MyWord* _root;
	bool _haveFormula;
	string _formula;
	static string wop_pair[][2] ;
	static string valid_rhs_pair[][2] ;
	static string other_pair[][2] ;
	static string gate_pair[][2];
};

#endif 
